Distributive Conditional Type
条件付き型がジェネリック型に作用する場合、ユニオン型が与えられると分配される
code:ts
type ToArray<Type> = Type extends any ? Type[] : never;
type StrArrOrNumArr = ToArray<string | number>;
//type StrArrOrNumArr = string[] | number[]
(string | number)[]じゃないことに注意
これは
code:ts
ToArray<string | number>
これが、
ToArray<string> | ToArray<number>;
こう分配されたから
このふるまいは大抵は期待するものだが、これを避ける場合は
code:ts
type ToArrayNonDist<Type> = Type extends any ? Type[] : never; このように、extendsの両側をbracketで囲う
つまり、unionであるかの判定は、extendsの左側にわたすもので判定されるということに注意?
じゃあなんでstring | number渡して(string | number)[]が取れるという直感が外れるのか、というところはもうちょっと深堀りして考えるべき
上記のdistributionの挙動も理にかなったものではあるのだから、なにか集合論的に考えることと、配列のジェネリックな性質とでどこかに認識の穴があるはず